﻿// 0925train03.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <limits>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

/*
 有N (3 <= N < 10000)个运动员，他们的id为0到N-1,他们的实力由一组整数表示
 他们之间进行比赛，需要决出冠亚军
 比赛的规则是0号和1号比赛，2号和3号比赛，
 以此类推，每一轮，相邻的运动员进行比赛，获胜的进入下一轮，实力值大的获胜，
 实力值相等的情况，id小的情况下获胜；轮空的直接进入下一轮。

输入描述
输入一行N个数字代表N个运动员的实力值(0 <= 实力值 <= 10000000000).

输出描述
输出冠亚季军的id，用空格隔开

输入
2 3 4 5
输出
3 1 2


2 3 4 5 2 3 4 5
 */
class Solution01
{
public:
	struct Node
	{
		long long val;
		int index;
		Node() = default;
		Node(long long val, int index) :val(val), index(index) {};
	};

	vector<Node>getNewItem(Node&node_1, Node&node_2)
	{
		vector<Node>sort_v = { node_1, node_2 };
		sort(sort_v.begin(), sort_v.end(), [](Node& node_1, Node& node_2)
		{
				if (node_1.val==node_2.val)
				{
					return node_1.index < node_2.index;
				}
				return node_1.val > node_2.val;
		});
		return sort_v;
	}

	Solution01(vector<long long>&num_vec)
	{
		//相邻的运动员进行比赛，获胜的进入下一轮，实力值大的获胜
		//他们的id为0到N-1
		//实力值相等的情况，id小的情况下获胜
		vector<Node>score_vec;
		int v_size = num_vec.size();
		for (int i=0; i<v_size; i++)
		{
			score_vec.push_back(Node(num_vec[i], i));
		}

		while (score_vec.size()>4)
		{
			vector<Node>new_vec;
			int v_size = score_vec.size();
			for (int i=0; i<v_size-1; i+=2)
			{
				vector<Node>new_item = getNewItem(score_vec[i], score_vec[i + 1]);
				new_vec.push_back(new_item[0]);
			}
			if (v_size%2!=0)
			{
				//处理轮空的情况
				new_vec.push_back(score_vec[v_size - 1]);
			}

			score_vec = new_vec;
			//while
		}

		vector<int>result(3);
		//if (score_vec.size() == 3)
		//{
		//	//轮空为季军，赢的冠军
		//	vector<Node>final12 = getNewItem(score_vec[0], score_vec[1]);
		//	result[0] = final12[0].index;
		//	result[1] = final12[1].index;
		//	result[2] = score_vec[2].index;
		//}

		if (score_vec.size()==3)
		{
			//败的为第3
			vector<Node>group1 = getNewItem(score_vec[0], score_vec[1]);
			//胜的跟轮空的决冠军
			vector<Node>final12 = getNewItem(group1[0], score_vec[2]);

			result[0] = final12[0].index;
			result[1] = final12[1].index;
			result[2] = group1[1].index;
		}
		if (score_vec.size()==4)
		{
			vector<Node>group1 = getNewItem(score_vec[0], score_vec[1]);
			vector<Node>group2 = getNewItem(score_vec[2], score_vec[3]);

			vector<Node>final12 = getNewItem(group1[0], group2[0]);
			vector<Node>final3 = getNewItem(group1[1], group2[1]);

			result[0] = final12[0].index;
			result[1] = final12[1].index;
			result[2] = final3[0].index;
		}

		int result_size = result.size();
		for (int i=0; i< result_size; i++)
		{
			cout << result[i];
			if (i!=result_size-1)
			{
				cout << ' ';
			}
		}

		//
	}
	//Solution01
};


/*
有一个荒岛，只有左右两个港口，只有一座桥连接这两个港口
现在有一群人需要从两个港口逃生，有的人往右逃生，有的往左逃生
如果两个人相遇，则 pk，体力值大的能够打赢体力值小的，体力值相同则同归于尽，
赢的人才能继续往前逃生，并减少相应的体力

输入描述
系列非 0 整数，用空格隔开，正数代表向右逃生，负数代表向左逃生

输出描述
最终能够逃生的人构成的序列
 */


int main()
{
	//2 3 4 5 6
	string input;
	getline(cin, input);
	stringstream oh_sstream(input);
	string token;
	vector<long long>num_vec;
	while (oh_sstream>>token)
	{
		num_vec.push_back(stoll(token));
	}
	Solution01 solu(num_vec);
	//long long num = 10000000000;
	//cout << num;

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
